Skip to content

Release v0.1.0-beta.2 — AI integration, schedule improvements, notification fixesFeature/ai agent#2

Merged
manfredsteger merged 271 commits into
mainfrom
feature/ai-agent
Apr 14, 2026
Merged

Release v0.1.0-beta.2 — AI integration, schedule improvements, notification fixesFeature/ai agent#2
manfredsteger merged 271 commits into
mainfrom
feature/ai-agent

Conversation

@manfredsteger
Copy link
Copy Markdown
Owner

Summary

This PR merges all work from feature/ai-agent into main for the v0.1.0-beta.2 release.


🤖 AI-Powered Poll Creation (GWDG KISSKI)

  • Natural language poll creation in German & English
  • Free tier included for every Polly installation (GWDG SAIA / KISSKI)
  • Voice input via GWDG Whisper API with real-time waveform visualization
  • Drag-and-drop reordering of AI-suggested slots
  • Follow-up refinement via chat ("Füge noch Montag Abend hinzu")
  • AI rate limiting configurable per guest/user in admin panel
  • AI API keys proxied server-side — never exposed to frontend

📅 Schedule Poll Improvements

  • Optional video conference URL field (shown in confirmation email and ICS attachment)
  • Chronological date sorting in the finalization view
  • Finalize button visible directly on the best-voted option
  • Labeled Yes/Maybe/No voting links in calendar event descriptions
  • ICS export: CANCELLED events removed, correct METHOD:REQUEST status

🔔 End Poll Notifications — All Poll Types

  • Survey: winning option text shown in finalization email
  • Organization: compact slot summary (filled / capacity) in email
  • Schedule: sends full date + time + ICS if date already confirmed
  • Frontend "notify participants" toggle is now actually wired to the backend (was disconnected in beta.1)
  • Creator email always included in recipient list

🔒 Security

  • File content validated at byte level (not just MIME header)
  • Inline scripts removed from HTML (CSP hardening)
  • Stricter cookie settings (HttpOnly, Secure, SameSite)
  • Stronger bcrypt password hashing

🐛 Fixes

  • ICS duplicate date/time display removed from finalization view
  • Vote deselection: re-submitting preserves existing selections
  • Test suite: 55 auth tests pass without race conditions
  • Missing translations added (de + en)
  • Pentest-Tools scan ID extraction fixed
  • Email deliverability: correct bulk headers, List-Unsubscribe

📚 Docs

  • CHANGELOG.md finalized for v0.1.0-beta.2
  • ROADMAP.md updated — all beta.2 goals marked complete
  • docs/RELEASING.md updated with beta.2 release steps
  • DOCKERHUB.md updated — auto-pushed to Docker Hub via CI
  • OpenAPI 3.0 spec (docs/openapi.yaml) — full endpoint reference

Type of Change

  • New feature
  • Bug fix
  • Security improvement
  • Documentation update

Checklist

  • TypeScript compiles without errors (npx tsc --noEmit)
  • CHANGELOG.md prepared
  • ROADMAP.md updated
  • DOCKERHUB.md updated

manfredsteger added 30 commits March 3, 2026 07:56
Update AI service to use date context and enable automatic date detection and day mode in the client for organization slots.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 47892e38-d961-4fcf-9430-12782d191e45
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/GU52eKA
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: d741657b-3928-41a9-ab50-b0236e64ff11
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/GU52eKA
Update AI service to increase the maximum number of poll options and tokens, and adjust prompts to dynamically generate options based on user input rather than enforcing strict limits.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 2ce74e84-19da-40f1-8fd3-2fd8a4bd238a
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/jTXJ4fX
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: d38f39be-00ce-4792-bb6d-9fd0fd2d8748
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/jTXJ4fX
…erience

Update UI text for various settings, implement a new function to add slots at the top of a list, and adjust the default behavior for multiple slot bookings in AI-generated polls.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 3e6ecb3c-a051-4365-a032-0e39abe4421a
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/RuQUdq4
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: fdc238dc-b6d7-4a03-bc60-7736edea3153
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/RuQUdq4
…t widget

Integrates `@dnd-kit` for drag-and-drop reordering of poll options and updates `AiChatWidget.tsx` to dynamically generate quick suggestion chips based on poll settings and language, enhancing user interaction.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 651fc6f4-03a0-4c9b-96a4-24f583e21c2c
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Adjust scroll target to the chat input and prevent auto-scroll on focus for a better user experience.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 4e84db23-8e23-4387-85fb-a0ce4693ad46
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Rearrange the settings UI to consolidate daily organization, slot duration, and quick template options within the main "Einstellungen" collapsible section, simplifying the primary view for users.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 2f9eb720-825b-4ace-b81d-87ce995aebba
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Remove all summary badges/pills from the collapsed settings header, including the broken translation key for results privacy.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: fc40ab4e-9265-4a4a-978e-70779625280d
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Fixes the 503 error for AI model loading by introducing a specific AI_MODEL_LOADING error message and updating client-side error handling to parse and display backend errors.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: a7c5c0f0-46db-4efc-afed-4b35da0ec8fc
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/nVYVBx4
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 640cd946-8e86-43fa-817b-e69c56367468
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/nVYVBx4
Increase the maximum character limits for poll descriptions and refinements in the AI backend and add character counters to the frontend chat widget.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 61dda38f-6940-42c3-bf59-765b970cb3a5
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: a3d02757-5f05-435a-a0a2-9ba6de0a9da1
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
Add missing translation keys for 'settings' in both German and English locales for the poll creation form.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: fc30cc86-e21e-43ea-821b-b0f8121dd5e5
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 0b995fcb-f202-4104-a97f-a1d170213f93
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
…isplay

Implement free-text question type for surveys, update results chart to display open answers, and refine AI prompt for generating diverse question formats.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c25e3c79-b62e-4f52-93fc-dfb943999e8a
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/poijNeB
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 888d1bdd-5479-4187-9308-957c625e1ff4
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/poijNeB
Adds localization for free text questions, enables drag-and-drop reordering of all survey options, and introduces dynamic hint text based on question types. Updates persistence to handle restored options by assigning unique IDs.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: f46d5215-76d4-4b88-af78-313ba392a614
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/gMZaGhC
Update AiChatWidget to correctly render survey options returned by the AI, supporting both string and object formats for free-text questions, resolving a runtime error.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 88e14e61-1413-484c-a059-07117de3d163
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/OtD2OTO
Add missing translation strings for "resultsPrivate" in German and English locale files.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c986911e-e0b5-4897-9a3e-be4fcbc718c8
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/OtD2OTO
Adds a new 'showWinner' boolean field to the poll schema, front-end components, and localization files to enable highlighting the most popular option in poll results.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 844c7a01-5b40-4a7d-a2ba-cbcba2528575
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/o7AXzc9
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 9e58520c-bbdf-4724-82d1-685a03101ff9
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/o7AXzc9
Introduce anonymous voting functionality, allowing users to cast votes without providing personal information. This involves updates to the UI for poll creation and voting, backend logic for handling anonymous votes using voter keys for deduplication, and database schema modifications to accommodate optional voter names and emails. Additionally, the results display is updated to handle anonymous participants more gracefully.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 65ec2cf6-e20f-4e04-b832-023d07ef5ea6
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/o7AXzc9
Adds translation keys, improves option deletion logic, implements drag-and-drop reordering for survey options, and makes hint text dynamic based on option types. Also fixes UI padding on the settings card.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 84542662-2941-4d73-aebd-d44fd62bca45
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/TOqqpik
…n process

Remove the "Add question" button and related UI elements for free-text questions. Clean up localization files by removing unused translation keys for free-text functionality. Adjust the delete logic for options to ensure at least two normal options remain, simplifying the process for creating surveys.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: ff66dae9-520c-47a8-a6a1-706f70d0871f
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/TOqqpik
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 95b4b1a6-99c8-44fb-9870-cc923340e703
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/TOqqpik
Adds an in-memory cache for AI settings on the server and implements optimistic rendering for the AI chat widget on the client to ensure it appears immediately on page load.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 0180aadd-7d6d-448c-88ed-544cb6f63162
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/pYT1BCd
Integrates DnD-kit for drag-and-drop slot reordering in the create organization form, adding a `SortableSlotItem` component and updating the slot mapping logic.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 7a93d935-78d4-4a90-afc0-5af4ab2e1f4f
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/pYT1BCd
manfredsteger added 13 commits April 9, 2026 06:08
… pass

Root cause: Vitest with `isolate: false` runs `setupFiles` beforeAll/afterAll
hooks once per test file AND executes multiple files concurrently. purgeTestData()
in setup.ts beforeAll was deleting users from other concurrently-running test files.

Changes:

vitest.config.ts:
- Added sequence.concurrent: false to serialize test suite execution

server/storage.ts:
- purgeTestData() now explicitly excludes admin users: users with role='admin'
  and users whose username matches ADMIN_USERNAME env var (default: 'admin')
- Prevents accidental deletion of privileged accounts on misconfigured/shared DBs

server/tests/globalTeardown.ts:
- Global setup calls storage.purgeTestData() before tests (pre-suite cleanup)
- Global teardown calls storage.purgeTestData() after all tests complete (post-suite)
- Both phases use storage method so all admin-protection guards are respected
- Pool is closed after cleanup in teardown

server/tests/setup.ts:
- Removed purgeTestData() from beforeAll (moved to globalSetup for race safety)
- beforeAll now only sets NODE_ENV and saves branding snapshot

server/tests/auth/sessionPersistence.test.ts:
- Added afterAll that deletes only the users created in this file (targeted,
  no races with concurrent test files)
- Tracks ALL created users via createdUserIds[] array (including user2 in the
  Multiple User Sessions test)
- createTestUserDirectly() now returns user.id for tracking
- Added afterAll import

Result: All 55 auth tests pass. No test users remain after run. Admin accounts
are explicitly protected from deletion in all cleanup paths.
Update test data cleanup to include legacy email patterns and refine admin role protection to allow deletion of test admin accounts while safeguarding production admin accounts.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 403e8556-e6b3-4d85-aadd-de315efade29
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/I4scND4
Adjust email headers and test user email domains, and resolve race conditions in test execution by removing aggressive test data purging from security hardening tests, ensuring all tests pass.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 00fad495-88c1-4842-93f7-755fd09d90e9
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RDXecY2
Add 8 missing translation keys to the `voteEdit` section in both `de.json` and `en.json` locale files, resolving untranslated text in the UI.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 3bfd3722-2d99-4b39-a63e-db431e2b9c73
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/IU3JrTC
Update `de.json` and `en.json` to include missing translation keys for user management, poll settings, and matrix functionalities.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: fc1e4599-dc98-4d49-bf16-7d0c2601a258
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/IU3JrTC
Include poll creator's email in the recipient list for finalization emails in `server/routes/polls.ts`.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 66682c58-0372-4577-9a80-0e4748fa407f
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RzNtFV4
Refactors the poll finalization route to send emails for all poll types, not just schedule polls. Introduces a new `sendPollEndedEmails` method in `emailService.ts` and updates email templates in `emailTemplateService.ts` to handle different poll statuses and visibility of results.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: ac97ed31-0321-4935-b520-4af2a1085fa6
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RzNtFV4
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: b5adc099-f3f2-41fa-b68a-4b7c460e2c28
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RzNtFV4
Closes four related gaps in poll finalization email notifications:

1. Frontend fix (client/src/pages/poll.tsx):
   - Added `notifyParticipants?: boolean` to updatePollMutation type
   - Pass `notifyParticipants: endPollNotifyParticipants` to mutate() in
     "End Poll" dialog — previously the toggle existed but had no effect

2. Backend fix - PATCH /admin/:token (server/routes/polls.ts):
   - Extract `notifyParticipants` from request body
   - After updating poll, if `isActive === false && notifyParticipants === true`:
     • Collect voter emails + creatorEmail (Set dedup)
     • Organization polls: count 'yes' votes per option → slotSummary
     • Survey polls: look up poll.finalOptionId → finalOptionText
     • Call sendPollEndedEmails() with appropriate args
   - Response is sent first (res.json) then email fires async (no latency impact)

3. Survey email content (server/routes/polls.ts + emailService.ts):
   - Finalize endpoint: find winningOption by finalOptionId and pass .text
   - PATCH endpoint: check poll.finalOptionId, pass option text if set
   - sendPollEndedEmails() gets new optional `finalOptionText?: string` param

4. Orga email content (server/routes/polls.ts + emailService.ts):
   - sendPollEndedEmails() gets new optional slotSummary param
   - Slot summary: max 5 slots shown, "… und X weitere" if more
   - Capacity format: "Slot text: 3 / 5 belegt" or "3 belegt" if unlimited

5. Email template (server/services/emailTemplateService.ts):
   - buildV3PollFinalizedBody: reads finalOptionText and slotSummaryHtml
   - Survey: shows "Festgelegtes Ergebnis: {option}" below result note
   - Orga: shows "Slot-Übersicht:" with compact slot list
   - Schedule path unchanged (already complete)

TypeScript: zero type errors. Existing tests unaffected (pre-existing Babel
issue with import type in Jest context is unrelated to these changes).
…all types)

Closes four related gaps in poll finalization email notifications:

1. Frontend fix (client/src/pages/poll.tsx):
   - Added `notifyParticipants?: boolean` to updatePollMutation type
   - Pass `notifyParticipants: endPollNotifyParticipants` to mutate() in
     "End Poll" dialog — previously the toggle existed but had no effect

2. Backend fix - PATCH /admin/:token (server/routes/polls.ts):
   - Extract `notifyParticipants` from request body
   - After res.json(), if `isActive === false && notifyParticipants === true`:
     • Collect voter emails + creatorEmail (Set dedup)
     • Schedule polls with confirmed date → sendFinalizationEmails() with
       date/time/ICS (mirrors finalize endpoint exactly); no confirmed date
       → generic "poll ended" email
     • Organization polls: count 'yes' votes per option → slotSummary
     • Survey polls: look up poll.finalOptionId → finalOptionText
     • Call sendPollEndedEmails() with appropriate args

3. Survey email content (server/routes/polls.ts + emailService.ts):
   - Finalize endpoint: find winningOption by finalOptionId and pass .text
   - PATCH endpoint: check poll.finalOptionId, pass option text if already set
   - sendPollEndedEmails() gets new optional `finalOptionText?: string` param

4. Orga email content (server/routes/polls.ts + emailService.ts):
   - sendPollEndedEmails() gets new optional slotSummary param
   - Slot summary: max 5 slots shown, "… und X weitere" if more
   - Capacity format: "Slot text: 3 / 5 belegt" or "3 belegt" if unlimited

5. Email template (server/services/emailTemplateService.ts):
   - buildV3PollFinalizedBody: reads finalOptionText and slotSummaryHtml
   - Survey: shows "Festgelegtes Ergebnis: {option}" below result note
   - Orga: shows "Slot-Übersicht:" with compact slot list
   - Schedule path unchanged (already complete)

TypeScript: zero type errors.
…tifications

Refactor email template service to correctly handle extra content in finalized poll emails and add specific email dispatch logic for schedule polls when they are ended.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: b85543d2-b0a6-4421-8005-e207b0737d45
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/XfGq0Kw
Update CHANGELOG.md, ROADMAP.md, and RELEASING.md to reflect the latest beta release, including new AI features and improved scheduling.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 94e06f7d-5d83-4899-be50-c61955ea86e5
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/GhRpOsq
Update DOCKERHUB.md to reflect the specific version tag as 0.1.0-beta.2.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 77489a3a-f6ff-454b-baac-6ba61dfef427
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/GhRpOsq
@manfredsteger manfredsteger self-assigned this Apr 10, 2026
Fixes an issue where file uploads with invalid types returned a 500 error instead of 400. Also ensures the admin account is seeded correctly for testing environments.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 353227ea-8df7-4af2-9fcb-d9e3b38b4129
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/B41xYnO
manfredsteger added 2 commits April 10, 2026 07:46
Add a NODE_ENV guard to globalTeardown.ts and reset the isInitialAdmin flag after seeding to prevent test environment API calls from being blocked.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 97e77715-de12-40c4-8fc5-ee10bd271dd6
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/zhQGYuC
Add new tests to verify correct handling of spoofed file uploads and ensure administrator functionality is not blocked after initial setup.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c1d9ac89-31da-4706-9a53-f0dbdc2cf5ef
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/zhQGYuC
…lias

The Vitest globalSetup context (main process, not test worker fork) may not
resolve the @shared/schema path alias configured in vitest.config.ts.
Both server/db.ts (import * as schema from '@shared/schema') and
server/seed-admin.ts transitively depend on this alias.

When @shared fails to resolve, the entire import chain throws inside the
catch {} block, the admin is never seeded, tests that authenticate as admin
succeed in creating an app session, but the isInitialAdmin middleware then
blocks all API calls with 403 → 146 cascading test failures.

Fix: create a bare pg.Pool in globalSetup (zero external alias deps) and use
a raw UPSERT to ensure the admin row exists with isInitialAdmin=false.
This is guaranteed to work regardless of Vite alias resolution.
WCAG 2.1 AA / CRITICAL: GripVertical icon buttons had no accessible name,
causing axe-core button-name violation in E2E tests.

- create-survey.tsx: aria-label={t('createSurvey.moveOption')}
- en.json: createSurvey.moveOption = 'Reorder option'
- de.json: createSurvey.moveOption = 'Option verschieben'

create-organization.tsx already had aria-label='Verschieben' (no change needed).
…leakage

The 'should not leak session data between different sessions' test failed in CI
with response1.body.user === null — indicating agent1's login returned non-200
(most likely 429 Too Many Requests) leaving agent1 without a session cookie.

Root cause (best hypothesis): with isolate:false and singleFork:true, the
loginRateLimiter singleton persists across all 46 test files. If any preceding
file left failed-login entries for the same (email, ip) pair — or if the
rate-limiter accumulated state from other tests — the login for the unique
'cookietest-...' users could be inadvertently blocked.

Fix:
1. loginRateLimiter.clearAll() at the start of the test to guarantee a clean
   rate-limit slate regardless of preceding test order.
2. Assert loginRes1.status === 200 / loginRes2.status === 200 — if login
   fails for any reason the test now reports the actual HTTP status code
   instead of a confusing 'Cannot read properties of null' TypeError.
3. Add explicit expect(response.body.user).not.toBeNull() guards before
   accessing .email / .id to surface the failure at the right assertion.
@manfredsteger manfredsteger merged commit afb0f93 into main Apr 14, 2026
5 checks passed
@manfredsteger manfredsteger deleted the feature/ai-agent branch April 14, 2026 05:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant